import os.path
import subprocess

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QGridLayout, QCheckBox, QComboBox, QLineEdit, QPushButton, QLabel, \
    QMessageBox


class MosAppstoreRules(QWidget):

    def on_own_rule_checkbox_clicked(self):
        if self.own_rule_checkbox.isChecked():
            self.user_group_combobox.setEnabled(True)
            self.allow_combobox.setEnabled(True)
            self.user_group_input_field.setEnabled(True)
        else:
            self.user_group_combobox.setDisabled(True)
            self.allow_combobox.setDisabled(True)
            self.user_group_input_field.setDisabled(True)

    def change_appstore_rules(self):
        if self.wheel_checkbox.isChecked():
            subprocess.run('dnf in -y mos-appstore-wheel-only', shell=True)
            # msg = 'Теперь магазин приложений М ОС смогут запускать только участники групы wheel.'
        else:
            subprocess.run('dnf remove -y mos-appstore-wheel-only', shell=True)
            # msg = 'Теперь магазин приложений М ОС смогут запускать все пользователи.'
        # dlg = QMessageBox()
        # dlg.setWindowTitle('Внимание!')
        # dlg.setText(msg)
        # dlg.exec()
        if self.own_rule_checkbox.isChecked():
            self.write_rule_to_file()
        else:
            subprocess.run(f'rm -rf {self.rule_filename}', shell=True)
        self.update_rule_text()
        dlg = QMessageBox()
        dlg.setWindowTitle('Внимание!')
        dlg.setText('Правила доступа к магазину приложений изменены.')
        dlg.exec()

    def write_rule_to_file(self):
        if self.user_group_input_field.text() == '':
            dlg = QMessageBox()
            dlg.setWindowTitle('Внимание!')
            dlg.setText('Вы не ввели имя пользователя или группы')
            dlg.exec()
            return

        if self.allow_combobox.currentIndex() == 0:
            allow_action = 'YES'
        else:
            allow_action = 'NO'
        if self.user_group_combobox.currentIndex() == 0:
            subject = f' == "{self.user_group_input_field.text()}"'
        else:
            subject = f'.isInGroup("{self.user_group_input_field.text()}")'
        rule = [
            'polkit.addRule(function(action, subject) {',
            f'    if (action.id.match("ru.mos.os.admin-tweak") && subject{subject}) ' + '{',
            f'        return polkit.Result.{allow_action};',
            '    }',
            '});'
        ]
        with open(self.rule_filename, 'w') as out:
            print(*rule, sep='\n', file=out)

    def edit_rule(self):
        subprocess.run(f'kate {self.rule_filename}', shell=True)
        self.update_rule_text()

    def update_rule_text(self):
        try:
            self.current_rule_text.setText(''.join(open(self.rule_filename).readlines()))
        except Exception:
            self.current_rule_text.setText('Правило не найдено')

    def __init__(self):
        super().__init__()

        layout = QGridLayout()
        self.setLayout(layout)

        self.rule_filename = '/etc/polkit-1/rules.d/49-mos-appstore-wheel.rules'
        is_rule_exist = os.path.isfile(self.rule_filename)

        appstore_rules_header_label = QLabel('Правила запуска магазина М ОС')
        appstore_rules_header_label.setAlignment(Qt.AlignCenter)
        layout.addWidget(appstore_rules_header_label, 0, 0, 1, 2)
        allowed_label = QLabel('Разрешение: ')
        allowed_label.setAlignment(Qt.AlignRight)
        layout.addWidget(allowed_label, 1, 0)
        self.wheel_checkbox = QCheckBox('Только участникам wheel')
        self.own_rule_checkbox = QCheckBox('Добавить собственное правило')
        self.own_rule_checkbox.clicked.connect(self.on_own_rule_checkbox_clicked)
        layout.addWidget(self.wheel_checkbox, 1, 1)

        rules_label = QLabel('Правила: ')
        rules_label.setAlignment(Qt.AlignRight)
        layout.addWidget(rules_label, 2, 0)

        layout.addWidget(self.own_rule_checkbox, 2, 1)

        object_label = QLabel('Объект: ')
        object_label.setAlignment(Qt.AlignRight)
        layout.addWidget(object_label, 3, 0)
        name_label = QLabel('Имя: ')
        name_label.setAlignment(Qt.AlignRight)
        layout.addWidget(name_label, 4, 0)
        action_label = QLabel('Действие: ')
        action_label.setAlignment(Qt.AlignRight)
        layout.addWidget(action_label, 5, 0)

        self.allow_combobox = QComboBox()
        self.user_group_combobox = QComboBox()
        self.allow_combobox.addItems(['Разрешить запуск', 'Запретить запуск'])
        self.user_group_combobox.addItems(['Пользователь', 'Группа'])
        layout.addWidget(self.allow_combobox, 5, 1)
        layout.addWidget(self.user_group_combobox, 3, 1)
        self.user_group_input_field = QLineEdit()
        layout.addWidget(self.user_group_input_field, 4, 1)

        current_rule_infolabel = QLabel('Текущее правило:')
        layout.addWidget(current_rule_infolabel, 6, 0)
        self.current_rule_text = QLabel()
        self.current_rule_text.setWordWrap(True)
        self.update_rule_text()
        layout.addWidget(self.current_rule_text, 6, 1)

        edit_rule_button = QPushButton('Редактировать')
        edit_rule_button.clicked.connect(self.edit_rule)
        # ok_button = QPushButton('Ok')
        # ok_button.clicked.connect(self.change_appstore_rules)
        # cancel_button = QPushButton('Cancel')
        # cancel_button.clicked.connect(self.close)
        layout.addWidget(edit_rule_button, 7, 1)
        # layout.addWidget(ok_button, 5, 1)
        # layout.addWidget(cancel_button, 5, 2)
        if is_rule_exist:
            self.own_rule_checkbox.setChecked(True)
        else:
            self.own_rule_checkbox.setChecked(False)
        self.on_own_rule_checkbox_clicked()
        # self.setWindowTitle('Правила запуска для магазина М ОС')
        # self.show()
